package com.zyh.alpacaDemo.forest;

import com.dtflys.forest.Forest;
import com.dtflys.forest.config.ForestConfiguration;
import com.dtflys.forest.http.ForestResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zyh.alpacaDemo.account.Account;
import com.zyh.alpacaDemo.order.pojo.OrderRequest;
import com.zyh.alpacaDemo.order.pojo.OrderResponse;

import java.util.Base64;

/**
 * Alpaca 账户服务类 - 基于 Forest 框架实现
 *
 * Forest 是一个轻量级的 HTTP 客户端框架，相比 OkHttp 更加简洁易用
 * 本类用于查询 Alpaca 账户信息
 */
public class AlpacaAccountService {

    // API 认证信息 - 实际项目中应从环境变量或配置文件中读取
    private static final String API_KEY_ID = "CK12643YAM8UFHA6L62I";
    private static final String API_SECRET_KEY = "geWlg29V86nGODx8105u8u1kcefbW7Hy2tGCeHaP";

    // Alpaca API 基础 URL
    private static final String BASE_URL = "https://broker-api.sandbox.alpaca.markets";

    // Forest 配置对象，用于全局配置 HTTP 客户端参数
    private final ForestConfiguration forestConfig;

    // JSON 处理器，用于序列化/反序列化 JSON 数据
    private final ObjectMapper objectMapper;

    /**
     * 构造函数 - 初始化 Forest 配置和 JSON 处理器
     */
    public AlpacaAccountService() {
        // 1. 获取 Forest 全局配置实例
        // Forest.config() 返回单例配置对象，可用于设置全局参数
        forestConfig = Forest.config();

        // 2. 配置全局参数
        // 开启请求日志，便于调试
        forestConfig.setLogEnabled(true);
        // 设置连接超时时间为 15 秒
        forestConfig.setConnectTimeout(15 * 1000);
        // 设置读取超时时间为 15 秒
        forestConfig.setReadTimeout(15 * 1000);
        // 3. 初始化 Jackson ObjectMapper
        // 用于处理 JSON 数据的序列化和反序列化
        objectMapper = new ObjectMapper();
    }

    /**
     * 根据账户 ID 查询账户信息
     *
     * @param accountId 要查询的账户 ID
     * @return Account 账户信息对象
     * @throws RuntimeException 当 API 请求失败或解析出错时抛出
     */
    public Account getAccountById(String accountId) {
        // 1. 构建 Basic Auth 认证头
        // Alpaca API 使用 Basic Auth 认证方式
        String credentials = API_KEY_ID + ":" + API_SECRET_KEY;
        String authHeader = "Basic " + Base64.getEncoder().encodeToString(credentials.getBytes());

        try {
            // 2. 使用 Forest 构建并发送 HTTP GET 请求
            // Forest.get() 创建 GET 请求
            // url() 设置完整请求 URL
            // addHeader() 添加 HTTP 头
            // execute(Account.class) 执行请求并自动反序列化为 Account 对象
            Account account = Forest.get(BASE_URL + "/v1/accounts/" + accountId)
                    // 指定期望的响应格式
                    .addHeader("accept", "application/json")
                    // 添加认证头
                    .addHeader("authorization", authHeader)
                    // 执行请求并返回 Account 对象
                    .execute(Account.class);

            // 3. 返回解析后的账户对象
            return account;

        } catch (Exception e) {
            // 4. 统一异常处理
            // 将所有异常包装为 RuntimeException，便于上层处理
            throw new RuntimeException("账户查询失败: " + e.getMessage(), e);
        }
    }

    /**
     * 主函数 - 用于测试账户查询功能
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 1. 创建服务实例
        AlpacaAccountService service = new AlpacaAccountService();

        // 2. 设置要查询的账户 ID
        String accountId = "85fae14c-0f3c-4789-b8c8-37af34128cec";

        try {
            System.out.println("正在查询账户信息...");

            // 3. 调用账户查询方法
            Account account = service.getAccountById(accountId);

            // 4. 输出账户信息
            System.out.println("\n====== 账户详情 ======");
            System.out.println("账户ID: " + account.getId());
            System.out.println("账户状态: " + account.getStatus());
            System.out.println("购买力: " + account.getBuyingPower());

            // 5. 输出完整 JSON 响应（用于调试）
            System.out.println("\n完整JSON响应:");
            System.out.println(new ObjectMapper().writeValueAsString(account));

        } catch (Exception e) {
            // 6. 异常处理
            System.err.println("查询账户失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
